/**PDA 扫码和打印功能模块 */

const pdaScanApi = {
  data() {
    return {
      // 扫码相关属性
      scanReceiver: null, // 广播接收器
      scanCallback: null, // 扫码结果回调函数
      isScanning: false, // 是否正在扫描
      devicePlatformModule: null, // 设备平台模块
    };
  },

  created() {
    this.initScanModule();
  },

  beforeDestroy() {
    this.stopPdaScan();
  },

  methods: {
    /**
     * 初始化扫码模块
     */
    initScanModule() {
      try {
        // 获取原生插件
        this.devicePlatformModule = uni.requireNativePlugin("TH-PlatformSDK");
        console.log("PDA扫码模块初始化成功");
      } catch (error) {
        console.error("PDA扫码模块初始化失败:", error);
      }
    },

    /**
     * 开始PDA扫码（连续扫描模式）
     * @param {Function} callback - 扫码结果回调函数
     * @param {Object} options - 扫描配置选项
     */
    startPdaScan(callback, options = {}) {
      if (!this.devicePlatformModule) {
        console.error("PDA扫码模块未初始化");
        return false;
      }

      if (this.isScanning) {
        console.log("PDA扫码已在进行中");
        return true;
      }

      try {
        this.scanCallback = callback;
        this.isScanning = true;

        // 设置扫描模式：0手动模式，0广播输出模式
        this.devicePlatformModule.setScanMode(0, 0);

        // 注册广播接收器
        this.registerScanReceiver();

        // 监听扫码状态（可选）
        this.devicePlatformModule.addStatusActionListener((res) => {
          console.log("扫码状态监听 res == " + res);
          // 可以在这里处理扫描状态，如显示状态提示
        });

        console.log("PDA连续扫码已启动");
        return true;
      } catch (error) {
        console.error("启动PDA扫码失败:", error);
        this.isScanning = false;
        return false;
      }
    },

    /**
     * 停止PDA扫码
     */
    stopPdaScan() {
      if (!this.isScanning) {
        return;
      }

      try {
        // 注销广播接收器
        this.unregisterScanReceiver();

        // 移除状态监听器
        if (this.devicePlatformModule) {
          this.devicePlatformModule.removeStatusActionListener();
        }

        this.isScanning = false;
        this.scanCallback = null;
        console.log("PDA扫码已停止");
      } catch (error) {
        console.error("停止PDA扫码失败:", error);
      }
    },

    /**
     * 注册扫码广播接收器
     */
    registerScanReceiver() {
      if (!this.devicePlatformModule) return;

      try {
        const main = plus.android.runtimeMainActivity();
        const that = this;

        // 创建广播接收器
        this.scanReceiver = plus.android.implements(
          "io.dcloud.feature.internal.reflect.BroadcastReceiver",
          {
            onReceive: function (context, intent) {
              plus.android.importClass(intent);
              const action = intent.getAction();

              if (action === "android.intent.ACTION_DECODE_DATA") {
                const barcodeStr = intent.getStringExtra("barcode_string");
                console.log("PDA扫码结果:" + barcodeStr);

                // 执行回调函数
                if (
                  that.scanCallback &&
                  typeof that.scanCallback === "function"
                ) {
                  that.scanCallback(barcodeStr);
                }
              }
            },
          }
        );

        // 注册广播过滤器
        const IntentFilter = plus.android.importClass(
          "android.content.IntentFilter"
        );
        const filter = new IntentFilter();
        filter.addAction("android.intent.ACTION_DECODE_DATA");
        main.registerReceiver(this.scanReceiver, filter);

        console.log("扫码广播接收器注册成功");
      } catch (error) {
        console.error("注册扫码广播接收器失败:", error);
      }
    },

    /**
     * 注销扫码广播接收器
     */
    unregisterScanReceiver() {
      if (!this.scanReceiver) return;

      try {
        const main = plus.android.runtimeMainActivity();
        main.unregisterReceiver(this.scanReceiver);
        this.scanReceiver = null;
        console.log("扫码广播接收器已注销");
      } catch (error) {
        console.error("注销扫码广播接收器失败:", error);
      }
    },

    /**
     * 设置扫码参数
     * @param {Array} keyInts - 参数键数组
     * @param {Array} valueInts - 参数值数组
     */
    setScanParameterInts(keyInts, valueInts) {
      if (!this.devicePlatformModule) return;

      return new Promise((resolve, reject) => {
        this.devicePlatformModule.setScanParameterInts(
          keyInts,
          valueInts,
          (ret) => {
            console.log("设置扫码参数 ret == " + ret);
            if (ret === 0) {
              resolve(ret);
            } else {
              reject(new Error("设置扫码参数失败"));
            }
          }
        );
      });
    },

    /**
     * 重构的手持打印主方法
     * 完整的打印生命周期管理：初始化、执行、销毁
     * @param {string} code - 编码（同时也是二维码内容）
     * @param {string} remark1 - 备注1
     * @param {string} remark2 - 备注2
     * @param {string} remark3 - 备注3
     * @returns {boolean} 打印结果
     */
    pdaPrint(code, remark1, remark2, remark3) {
      let printResult = false;

      // 执行主打印方法
      const mainResult = this.printManager(code, remark1, remark2, remark3);

      // 执行备用打印方法
      // const backupResult = this.pdaPrintBackup(code, remark1, remark2, remark3);

      // 只要有一个方法成功就返回true
      // printResult = backupResult || mainResult;

      return mainResult;
    },

    printManager(code, remark1, remark2, remark3) {
      try {
        var urovoPlatformModule = uni.requireNativePlugin(
          "TH-PlatformSDK-PrinterManager"
        );

        // 🔥修复：使用自动高度模式(-1)，避免内容被压缩到同一页面
        urovoPlatformModule.setupPage(384, -1); // -1 = 自动高度模式，内容多高页面就多高
        var fontSize = 24; // 主字体增大到24号
        var remarkFontSize = 22; // 备注字体配套增大到22号
        var fontStyle = 0x0000;
        var fontName = "simsun";
        var height = 1;

        // 🔥优化布局计算：适配自动高度模式
        const totalHeight = -1; // -1 = 自动高度，内容决定页面高度
        const margin = 16; // 2mm × 8 dots/mm = 16 dots (边距)
        const topMargin = 5; // 🔥增加上边距到5mm（40dots），解决整体偏上问题
        const availableHeight = 1000; // 自动模式下，设置足够大的可用高度

        const qrCodeSize = 180; // 🔥二维码尺寸从144增加到180 dots (22.5mm)
        const fontHeight = 28; // 3.5mm × 8 = 28 dots (24号字体高度)
        const remarkFontHeight = 26; // 22号字体高度
        const colSpacing = 16; // 2mm × 8 = 16 dots (列间距)

        // 计算文字区域参数
        const textLeft = margin + qrCodeSize + colSpacing; // 文字起始X位置
        const textWidth = 384 - textLeft - margin; // 文字可用宽度
        const textAvailableHeight = availableHeight; // 文字可用高度

        // 🔥绘制更大的二维码（左侧顶部）- 方案一实现
        // 修复：使用累积高度模式，参考demo实现
        var barcodeY = topMargin; // 🔥从增加的顶部边距开始，解决整体偏上问题
        urovoPlatformModule.drawBarcode(
          code,
          margin, // X坐标：左侧边距
          barcodeY, // Y坐标：使用独立变量，避免冲突
          58, // QR码类型：58表示QR-CODE
          7, // 纠错级别：7表示标准纠错
          qrCodeSize, // 🔥二维码高度：180 dots (更大更清晰的二维码)
          0 // 🔥二维码宽度：0表示自动宽度（参考demo）
        );

        // 计算文字内容分布
        const textStartY = topMargin; // 🔥文字也从增加的顶部边距开始
        let currentTextY = textStartY;

        // 🔥显示编码（右侧顶部，更大字体）
        currentTextY += urovoPlatformModule.drawTextEx(
          code,
          textLeft,
          currentTextY,
          textWidth,
          fontHeight,
          fontName,
          fontSize, // 🔥24号字体，更大更醒目
          0, // 左对齐
          fontStyle,
          0
        );
        currentTextY += 20; // 🔥增大行间距到20

        // 🔥自动高度模式下，简化布局计算
        const usedHeight = currentTextY; // 已用高度（二维码 + 编码文字）
        const remarkCount =
          (remark1 ? 1 : 0) + (remark2 ? 1 : 0) + (remark3 ? 1 : 0);

        console.log(
          `📊 自动高度模式: 已用高度=${usedHeight}dots, 备注数量=${remarkCount}`
        );
        console.log(
          `🔍 drawBarcode调试: 内容="${code}", X=${margin}, Y=${barcodeY}, 尺寸=${qrCodeSize}x0`
        );

        if (remarkCount > 0) {
          const remarkSpacing = 40; // 固定间距40dots，避免计算复杂

          if (remark1) {
            urovoPlatformModule.drawTextEx(
              remark1,
              textLeft,
              currentTextY,
              textWidth,
              remarkFontHeight, // 🔥使用22号字体高度
              fontName,
              remarkFontSize, // 🔥22号字体，配套变大
              0,
              fontStyle,
              0
            );
            currentTextY += remarkSpacing;
          }

          if (remark2) {
            urovoPlatformModule.drawTextEx(
              remark2,
              textLeft,
              currentTextY,
              textWidth,
              remarkFontHeight, // 🔥使用22号字体高度
              fontName,
              remarkFontSize, // 🔥22号字体，配套变大
              0,
              fontStyle,
              0
            );
            currentTextY += remarkSpacing;
          }

          if (remark3) {
            urovoPlatformModule.drawTextEx(
              remark3,
              textLeft,
              currentTextY,
              textWidth,
              remarkFontHeight, // 🔥使用22号字体高度
              fontName,
              remarkFontSize, // 🔥22号字体，配套变大
              0,
              fontStyle,
              0
            );
          }
        }

        // 🔥修复：参考demo的走纸实现，使用drawText方法打印空白行
        // 参考ext-module-printer.nvue中的实现：height += urovoPlatformModule.drawText("   \n",0,height,fontName,fontSize,true,false,0);
        currentTextY += urovoPlatformModule.drawText(
          "   \n",
          0,
          currentTextY,
          fontName,
          fontSize,
          true,
          false,
          0
        ); // 打印空白行
        currentTextY += urovoPlatformModule.drawText(
          "   \n",
          0,
          currentTextY,
          fontName,
          fontSize,
          true,
          false,
          0
        ); // 打印空白行
        currentTextY += urovoPlatformModule.drawText(
          "   \n",
          0,
          currentTextY,
          fontName,
          fontSize,
          true,
          false,
          0
        ); // 打印空白行
        currentTextY += urovoPlatformModule.drawText(
          "   \n",
          0,
          currentTextY,
          fontName,
          fontSize,
          true,
          false,
          0
        ); // 打印空白行

        console.log(
          `📏 走纸调试: 当前内容高度=${currentTextY}dots, 上边距=${topMargin}dots`
        );

        var ret = urovoPlatformModule.printPage(0); // 🔥修复：改为0，避免重复走纸，参考demo设置
        console.log(
          "printManager - printPage() ret == " +
            ret +
            "   " +
            this.getStatus(ret)
        );

        if (ret === 0) {
          console.log(`✅ 主打印方法执行成功，自动高度模式，内容高度自适应`);
          return true;
        } else {
          console.error(
            "主打印方法失败，错误码:",
            ret,
            this.getPrinterStatus(ret)
          );
          return false;
        }
      } catch (error) {
        console.error("主打印方法异常:", error);
        return false;
      }
    },

    /**
     * 获取打印机状态描述
     */
    getPrinterStatus(code) {
      const statusMap = {
        0: "打印机正常",
        "-1": "打印机缺纸",
        "-2": "打印机过热",
        "-3": "电量不足",
        "-4": "打印机忙",
        "-256": "打印机错误",
        "-257": "错误驱动程序",
      };
      return statusMap[code] || "未知状态";
    },

    /**
     * 打印状态码翻译（与 ext-module-printer.nvue 保持一致）
     * @param {number} code - 状态码
     * @returns {string} 状态描述
     */
    getStatus(code) {
      const map = {
        0: "打印正常",
        "-1": "打印机缺纸",
        "-2": "打印机过热",
        "-3": "电量不足",
        "-4": "打印机忙",
        "-256": "打印机错误",
        "-257": "错误驱动程序",
      };
      return map[code] || "未知状态";
    },
  },
};

// 命名导出，支持解构赋值导入
export { pdaScanApi };
// 默认导出，保持向后兼容性
export default pdaScanApi;
